﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RzCorportativo.DataAccess;

namespace RzCorportativo.Lib
{
    public class Fornecedor
    {
        public int FornecedorId { get; set; }
        public string Cnpj { get; set; }
        public string Nome { get; set; }
        public Endereco Endereco { get; set; }
        public string Telefone1 { get; set; }
        public string Telefone2 { get; set; }
        public string Telefone3 { get; set; }
        public string Email { get; set; }
        public int EnderecoId { get; set; }
        public bool IsNew { get { return this.FornecedorId == 0; } }
        public RzCorportativo.DataAccess.Fornecedor model;

        public bool Salvar()
        {
            bool @result = false;
            Transaction.Begin((entity) =>
            {
                if (this.Endereco != null)
                    if(!this.Endereco.Salvar())
                        throw new Exception("Falha ao tentar salvar o endereço");
                this.EnderecoId = this.Endereco.EnderecoId;
                if (this.IsNew)
                    this.model = this.Insert(entity);
                else
                    this.model = this.Update(entity);
                return true;
            }).OnError((ex) =>
            {
                if (ex.InnerException != null && (ex.InnerException.Message ?? string.Empty).Contains("Violação da restrição UNIQUE KEY 'IX_Fornecedor'"))
                    throw new Exception("Cnpj já cadastrado");
                throw ex;
                @result = false;
            }).OnSuccess(() =>
            {
                @result = true;
                this.FornecedorId = this.model.FornecedorId;
            });
            return @result;
        }

        private RzCorportativo.DataAccess.Fornecedor Insert(RZCorporativoEntities entity)
        {
            var @item = this.CreateModel(entity);
            entity.AddToFornecedor(@item);
            return @item;
        }

        private RzCorportativo.DataAccess.Fornecedor Update(RZCorporativoEntities entity)
        {
            var @item = this.CreateModel(entity);
            return @item;
        }

        private RzCorportativo.DataAccess.Fornecedor CreateModel(RZCorporativoEntities entity)
        {
            var fornecedor = new RzCorportativo.DataAccess.Fornecedor();
            if (!this.IsNew)
            {
                fornecedor = entity.Fornecedor.Where(w => w.FornecedorId == this.FornecedorId).FirstOrDefault();
                if (fornecedor == null)
                    throw new Exception("Código inválido");
            }

            fornecedor.FornecedorId = this.FornecedorId;
            fornecedor.Cnpj = this.Cnpj;
            fornecedor.Email = this.Email;
            fornecedor.Nome = this.Nome;
            fornecedor.Telefone1 = this.Telefone1;
            fornecedor.Telefone2 = this.Telefone2;
            fornecedor.Telefone3 = this.Telefone3;
            if(this.EnderecoId > 0)
                fornecedor.EnderecoId = this.EnderecoId;
            return fornecedor;
        }

        internal Fornecedor CreateFornecedor(RzCorportativo.DataAccess.Fornecedor item)
        {
            Fornecedor fornecedor = new Fornecedor();
            fornecedor.FornecedorId = item.FornecedorId;
            fornecedor.Cnpj = item.Cnpj;
            fornecedor.Email = item.Email;
            fornecedor.Nome = item.Nome;
            fornecedor.Telefone1 = item.Telefone1;
            fornecedor.Telefone2 = item.Telefone2;
            fornecedor.Telefone3 = item.Telefone3;
            fornecedor.EnderecoId = item.EnderecoId ?? 0;
            return fornecedor;
        }

        public static List<Lib.Fornecedor> Listar(Lib.Fornecedor fornecedor)
        {
            if (fornecedor == null)
                fornecedor = new Fornecedor();
            List<Fornecedor> fornecedores = new List<Fornecedor>();
            RzCorportativo.DataAccess.RZCorporativoEntities db = new RZCorporativoEntities();
            fornecedores = db.Fornecedor.Where(w =>
                    ((fornecedor.FornecedorId == 0) || (fornecedor.FornecedorId == w.FornecedorId)) &&
                    ((fornecedor.Nome == null || fornecedor.Nome == "") || (w.Nome.Contains(fornecedor.Nome))) &&
                    ((fornecedor.Cnpj == null || fornecedor.Cnpj == "") || (w.Cnpj.StartsWith(fornecedor.Cnpj))) 
                ).ToList().Select(s => fornecedor.CreateFornecedor(s)).ToList();
            return fornecedores;
        }
    }
}
